#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

void handle(int signo)
{
    cout << "我是进程:" << getpid() << "; 我收到信号:" << signo << endl;
}

// int main()
// {
//     //signal(2, handle);
//     signal(2, handle);
//     while(true)
//     {
//         cout << "我是一只小小小小鸟~ pid:" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }

// mykill -signumber pid
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         cerr << "Usage: " << argv[0] << " -signumber pid" << std::endl;
//         return 1;
//     }

//     //memcpy(argv[1], argv[1] + 1, strlen(argv[1]) - 1);
//     int id = atoi(argv[2]);
//     int signo = abs(atoi(argv[1]));

//     int n = kill(id, signo);
//     return n;
// }

// raise
//  int main()
//  {
//      signal(2, handle);
//      while(1)
//      {
//          cout << "who am i" << endl;
//          sleep(2);
//          raise(2);
//      }
//      return 0;
//  }

// abort
//  int main()
//  {
//      signal(6, handle);
//      while(1)
//      {
//          cout << "who am i" << endl;
//          sleep(1);
//          abort();
//      }
//      return 0;
//  }

// alarm
// 如果进程结束的快，设置的闹钟可能不会响
//  void handle2(int signo)
//  {
//      cout << "我是进程:" << getpid() << "; 我收到信号:" << signo << endl;
//      alarm(2);
//  }
//  int main()
//  {
//      signal(SIGALRM, handle2);
//      alarm(2);
//      while(1);
//      return 0;
//  }

// 硬件中断
//  int main()
//  {
//      signal(8, handle);

//     int a = 10;
//     int b = a / 0;

//     return 0;
// }

// 信号保存
//  void handle3(int signo)
//  {
//      cout << "信号递达" << endl;
//  }
void PrintPending(sigset_t &set)
{
    //std::cout << "curr process[" << getpid() << "]pending: ";
    for (int i = 31; i >= 1; --i)
    {
        cout << sigismember(&set, i) << " ";
    }
    cout << endl;
}
int main()
{
    sigset_t set, pen;
    sigemptyset(&set);
    sigemptyset(&pen);
    for (int i = 1; i <= 15; ++i)
    {
        sigaddset(&set, i);
    }
    sigprocmask(SIG_BLOCK, &set, nullptr);

    
    while (1)
    {
        sleep(1);
        cout << "pid:" << getpid() << endl;
        cout << "block: ";
        PrintPending(set);
        sigpending(&pen);
        cout << "pending: ";
        PrintPending(pen);
        cout << endl;
    }
    return 0;
}